#include "stm32f10x.h"                  // Device header
#include "LED_NonBlocking.h"

uint8_t LED1_Mode = 0;
uint8_t LED2_Mode = 0;
uint16_t LED1_Count = 0;
uint16_t LED2_Count = 0;

void LED_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_ResetBits(GPIOA, GPIO_Pin_0);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOC, &GPIO_InitStructure);
	GPIO_SetBits(GPIOC, GPIO_Pin_13);
}

void LED_SetMode(enum LED_NUM m, uint8_t Mode)
{
	switch (m)
	{
		case LED1: LED1_Mode = Mode; break;
		case LED2: LED2_Mode = Mode; break;
	
		default: break;
	}
}

void LED2_ON(void)
{
	GPIO_SetBits(GPIOA, GPIO_Pin_0);
}

void LED2_OFF(void)
{
	GPIO_ResetBits(GPIOA, GPIO_Pin_0);
}

void LED2_Turn(void)
{
	if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_0) == 0)
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_0);
	}
	else
	{
		GPIO_SetBits(GPIOA, GPIO_Pin_0);
	}
}

void LED1_ON(void)
{
	GPIO_ResetBits(GPIOC, GPIO_Pin_13);
}

void LED1_OFF(void)
{
	GPIO_SetBits(GPIOC, GPIO_Pin_13);
}

void LED1_Turn(void)
{
	if (GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_13) == 0)
	{
		GPIO_SetBits(GPIOC, GPIO_Pin_13);
	}
	else
	{
		GPIO_ResetBits(GPIOC, GPIO_Pin_13);
	}
}

void LED_Tick(void)
{
	switch (LED1_Mode)
	{
		case 0: LED1_OFF(); break;
		case 1: LED1_ON(); break;
		case 2: {
			LED1_Count++;
			LED1_Count %= 1000;
			if (LED1_Count < 500) {
				LED1_ON();
			} else {
				LED1_OFF();
			}
		} break;
		case 3: {
			LED1_Count++;
			LED1_Count %= 100;
			if (LED1_Count < 50) {
				LED1_ON();
			} else {
				LED1_OFF();
			}
		} break;
		case 4: {
			LED1_Count++;
			LED1_Count %= 1000;
			if (LED1_Count < 100) {
				LED1_ON();
			} else {
				LED1_OFF();
			}
		} break;
		default: LED1_OFF(); break;
	}

	switch (LED2_Mode)
	{
		case 0: LED2_OFF(); break;
		case 1: LED2_ON(); break;
		case 2: {
			LED2_Count++;
			LED2_Count %= 1000;
			if (LED2_Count < 500) {
				LED2_ON();
			} else {
				LED2_OFF();
			}
		} break;
		case 3: {
			LED2_Count++;
			LED2_Count %= 100;
			if (LED2_Count < 50) {
				LED2_ON();
			} else {
				LED2_OFF();
			}
		} break;
		case 4: {
			LED2_Count++;
			LED2_Count %= 1000;
			if (LED2_Count < 100) {
				LED2_ON();
			} else {
				LED2_OFF();
			}
		} break;
		default: LED2_OFF(); break;
	}
}

